package classloader;

/**
 *
 * <p>
 *     常量在编译阶段会存入到调用这个常量发方法所在的类的常量池中。
 *     本质上，调用类没有直接应用到定义常量的类。因此并不会触发定义常量的类的初始化
 *     注意：这里指的是将常量放到MyTest2的常量池中，之后MyTest2与MyParent2就没有任何关系了。
 *     甚至我们可以将MyParent2的class文件删除
 * </p>
 */
/*
classes\classloader>javap -c MyTest2.class

助记符：
    ldc  表示将 int，float或string类型的常量从常量池中推送至栈顶
    bipush 表示将 单字节 -129~127 的常量值推送至栈顶
    sipush 表示将一个短整型常量值（-32768~32767）推送至栈顶
    iconst_1 表示将int类型1推送至栈顶（iconst_1 - iconst_5）

 */

public class MyTest2 {

    public static void main(String[] args) {
        System.out.println(MyParent2.m);
    }
}

class MyParent2 {

    public static final String str = "hello world";
    public static final short s = 127;
    public static final int i = 128;
    public static final int m = 1;

    static {
        System.out.println("MyParent1 static block");
    }
}

class MyChild2 extends MyParent2 {

    static {
        System.out.println("MyChild1 static block");
    }
}
